package org.cainiao.basic.lambda;

import java.util.function.Consumer;

import static org.cainiao.basic.lambda.Test.CONST;
import static org.cainiao.basic.lambda.Test.staticValue;

/**
 * <br />
 * <p>
 * Author: Cai Niao(wdhlzd@163.com)<br />
 */
public class LambdaTest {

    public static void main(String[] args) {
        Test test = new Test();
        /*
         * 当使用 lambda 表达式时，本应该是先创建 Consumer 对象
         * 但编译后的字节码指令是：
         * invokedynamic #10,  0       // InvokeDynamic #0:accept:()Ljava/util/function/Consumer;
         */
        test.f(s -> {
            if (s != null) {
                System.out.println(s);
            }
        });
        System.out.println(CONST);
        System.out.println(staticValue);
        /*
         * 虽然这里创建匿名内部类的代码与前边的 lambda 表达式的作用相同
         * 但编译后的字节码指令却与 lambda 表达式时的编译结果不同
         * 不是 invokedynamic，而是创建匿名内部类对象的指令：
         * new           #36            // class org/cainiao/basic/lambda/LambdaTest$1
         * dup
         * invokespecial #38            // Method org/cainiao/basic/lambda/LambdaTest$1."<init>":()V
         */
        test.f(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
    }
}
